/**
 * gislin 2017年7月11日
 */
package com.btcode.orm.model;

import com.btcode.db.sqlparameter.SQLParameterList;
import com.btcode.orm.relation.ex.IRelation;
import java.io.Serializable;
import java.util.HashMap;
import java.util.List;

/**
 * @author gislin 2017年7月11日
 */
public interface IModel extends Serializable {

    /**
     * 获取关联关系 gislin 2017年7月18日
     */
    List<IRelation> getRelations();

    /**
     * 获取所有的字段 gislin 2017年7月18日
     */
    List<IField> getFields();

    /**
     * 获取域字段集 gislin 2017年8月24日
     */
    List<IDomainField> getDomainFields();

    /**
     * 获取表名称 gislin 2017年7月17日
     */
    String getTableName();

    /**
     * 获取属性值 设计思考 这里获取字段值 1、是要根据数据库的字段名 2、还是根据IField的名字？
     *
     * 如果是1 好处： 前端、后端的属性名和数据库的字段名一致，调试，排错都简单，开发体验好 坏处： 一旦字段名称发生变化，就需要全部改，麻烦
     *
     * 没有明确的好处和坏处，先倾向于开发体验好，选择第一种 gislin 2017年7月18日
     */
    Object getFieldValue(String columnName);

    /**
     * 设置属性 gislin 2017年7月19日
     */
    void setFieldValue(String columnName, Object value);

    /**
     * 获取关联关系 gislin 2017年7月19日
     */
    <Model extends IModel>List<Model> getRelationModel(String tableName);

    /**
     * 获取主键集合 gislin 2017年7月19日
     */
    List<IField> getKeyFields();

    /**
     * 设置关联数据 gislin 2017年7月19日
     */
    <Model extends IModel>void setRelationModel(String relationTableName, List<Model> models);

    /**
     * 设置关联数据 gislin 2017年7月19日
     */
    <Model extends IModel>void setRelationModels(HashMap<String, List<Model>> relationModels);

    /**
     * 是否需要缓存 gislin 2017年8月24日
     */
    boolean isNeedCache();

    /**
     * 获取model的附加信息 gislin 2017年9月19日
     */
    IModelAddition<?> getModelAddition();

    /**
     * 获取唯一约束的字段集合
     */
    List<IField> getUniques();

    SQLParameterList toSQLParameter(Integer index);

    /**
     * 是否来自缓存
     */
    boolean isFromCache();

}
